// Readers.h : Declaration of the CReaders

#pragma once
#include "resource.h"       // main symbols

#include <vector>

#include "CardLib_i.h"
#include "Reader.h"

#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
#endif

using namespace ATL;

typedef std::vector<IReader*>		ContainerType;

// The collection interface exposes the data as BSTRs
typedef VARIANT						CollectionExposedType;
typedef IReaders					CollectionInterface;

// Use IEnumVARIANT as the enumerator for VB compatibility
typedef VARIANT						EnumeratorExposedType;
typedef IEnumVARIANT				EnumeratorInterface;

// Typedef the copy classes using existing typedefs
typedef _CopyVariantFromInterface<ContainerType::value_type> EnumeratorCopyType;
typedef _CopyVariantFromInterface<ContainerType::value_type> CollectionCopyType;

typedef CComEnumOnSTL< EnumeratorInterface, &__uuidof(EnumeratorInterface), EnumeratorExposedType, EnumeratorCopyType, ContainerType > EnumeratorType;
typedef ICollectionOnSTLImpl< CollectionInterface, ContainerType, CollectionExposedType, CollectionCopyType, EnumeratorType > CollectionType;

// CReaders

class ATL_NO_VTABLE CReaders :
	public CComObjectRootEx<CComSingleThreadModel>,
	public CComCoClass<CReaders, &CLSID_Readers>,
	public IDispatchImpl<CollectionType, &IID_IReaders, &LIBID_CardLibLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
	enum {numReaders = 8};

	CReaders()
	{
		m_hCrdCtx = NULL;
		m_pmszReaders = NULL;

		IReader* pIReader = NULL;
		for (int i = 0; i < numReaders; i++)
		{
			CComObject<CReader> *pReader = new CComObject<CReader>;
			if(SUCCEEDED(pReader->QueryInterface(IID_IReader, (void**)&pIReader)))
				m_coll.push_back(pIReader);
		}
	}

DECLARE_REGISTRY_RESOURCEID(IDR_READERS)


BEGIN_COM_MAP(CReaders)
	COM_INTERFACE_ENTRY(IReaders)
	COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()



	DECLARE_PROTECT_FINAL_CONSTRUCT()

	HRESULT FinalConstruct()
	{
		return S_OK;
	}

	void FinalRelease()
	{
	}

public:
	SCARDCONTEXT m_hCrdCtx;
	LPTSTR m_pmszReaders;

};

OBJECT_ENTRY_AUTO(__uuidof(Readers), CReaders)
